<?php
class User_Bd{

	// Methode getUser($id_user) : retourne une instance User à partir d'un id_user
	static public function getUser($id_user) { 
		$db = Outils_Bd::getInstance()->getConnexion();
		$sth = $db->prepare("SELECT * FROM User WHERE id_user=:id_user");
		$data = array("id_user"=>$id_user);
		$sth->execute($data);
		$ligne = $sth->fetch(PDO::FETCH_ASSOC);
		$utilisateur = new User($ligne);    
		return $utilisateur;
	}
  
  	// Méthode checkMail($mail) : retourne la ligne qui a matché une adresse mail passé en paramètre (si elle existe déjà)
	static public function checkMail($mail){
		$db = Outils_Bd::getInstance()->getConnexion();
		$sth = $db->prepare("SELECT * FROM User WHERE mail=:mail");
		$data = array("mail"=>$mail);
		$sth->execute($data);
		$ligne = $sth->fetch(PDO::FETCH_ASSOC);
		return $ligne;
	}
	
	// Méthode addUser($user) : Enregistre un nouvel utilisateur dans la table User
	static public function addUser($user) { 
		$db = Outils_Bd::getInstance()->getConnexion();
		$sth=$db->prepare("INSERT INTO User (mail, password, name, facebook_id, birthdate, status, time) VALUES (:mail, :password, :name, :facebook_id, :birthdate, :status, :time)");
		$data=array(
			'mail' => $user->getMail(),
			'password' => sha1($user->getPassword()),
			'name'=>$user->getName(),
			'facebook_id' => $user->getFacebookId(),
			'birthdate' => $user->getBirthDate(),
			'status' => $user->getStatus(),
			'time' => $user->getTime()
			);
		$sth->execute($data);
	}
  
	/* Méthode modifyUser($user) : modifie les données dans la BD concernant un utilisateur donné */
	static public function modifyUser($user) {    
		$db = Outils_Bd::getInstance()->getConnexion();
		$sth=$db->prepare("UPDATE User SET name=:name, facebook_id=:facebook_id, birthdate=:birthdate, status=:status WHERE id_user=:id_user");
		$data=array(
			'id_user' => $user->getIdUser(),
			'name'=>$user->getName(),
			'birthdate' => $user->getBirthDate(),
			'status' => $user->getStatus(),
			'facebook_id' => $user->getFacebookId()
			);
		$sth->execute($data);
	}
	
	/* Méthode getSeniority($id_user) : Retourne l'ancienneté en jours d'un utilisateur */
	static public function getSeniority($id_user){
		$db = Outils_Bd::getInstance()->getConnexion();
		$sth = $db->prepare("SELECT (TO_DAYS(NOW()) - TO_DAYS(time)) as seniority FROM User WHERE id_user=:id_user");
		$data = array("id_user"=>$id_user);
		$sth->execute($data);
		$ligne = $sth->fetch(PDO::FETCH_ASSOC); 
		return $ligne['seniority'];		
	}
	
	/* Méthode getHistoryStats($id_user,$timeUnit,$limit=3) : SCORE -1 NON PRIS EN COMPTE
		Si $timeUnit = DATE : Retourne un tableau sous forme (clé = date => valeur = nb d'évaluations)
		Autrement : Retourne un tableau sous forme ( tableau  de tableau associatif( clé = 'nb_rating' => valeur = nb d'évaluation, clé = 'n_t' => valeur => numéro de la semaine))
	*/
	static public function getHistoryStats($id_user,$timeUnit,$limit=3){
		$paramTimeUnit = "";
		switch($timeUnit){
			case DAY:
				//$timeUnit = "TO_DAYS";
				$timeUnit = "DATE";
				break;
			case MONTH;
				$timeUnit = "MONTH";
				break;
			case WEEK:
				$timeUnit = "WEEK";
				$paramTimeUnit = ",1";
				break;
			default:
				throw new Exception("Erreur Unité de temps");
				break;	
		}
		$db = Outils_Bd::getInstance()->getConnexion();
		$sth = $db->prepare("SELECT COUNT(*) as nb_rating, {$timeUnit}(time{$paramTimeUnit}) AS n_t FROM Rating WHERE id_user=:id_user AND score>-1 AND {$timeUnit}(NOW(){$paramTimeUnit}) - {$timeUnit}(time{$paramTimeUnit}) < {$limit} GROUP BY n_t;");
		$data = array("id_user"=>$id_user);
		$sth->execute($data);
		$ligne = $sth->fetchAll(PDO::FETCH_ASSOC);
		return $ligne;		
	}
	
	/* Méthodes getUserRatingByScore($id_user) : Statistiques d'évaluations de l'utilisateur : Retourne un tableau associatif avec commes clés score et nb */
	static public function getUserRatingByScore($id_user){
		$db = Outils_Bd::getInstance()->getConnexion();
		$sth = $db->prepare("SELECT score, COUNT( * ) AS nb FROM Rating WHERE id_user=:id_user GROUP BY score");
		$data = array("id_user"=>$id_user);
		$sth->execute($data);
		$ligne = $sth->fetchAll(PDO::FETCH_ASSOC);
		return $ligne;			
	}
	
	/*Methodes getRatingCount($id_user) : Nb d'évaluations de l'utilisateur depuis son inscription SCORE -1 NON PRIS EN COMPTE */
	static public function getRatingCount($id_user){
		$db = Outils_Bd::getInstance()->getConnexion();
		$sth = $db->prepare("SELECT COUNT( * ) AS nb FROM Rating WHERE id_user=:id_user AND score>-1");
		$data = array("id_user"=>$id_user);
		$sth->execute($data);
		$ligne = $sth->fetch(PDO::FETCH_ASSOC);
		return $ligne['nb'];			
	}
	
	/* Méthode getUsersFromSearch($clause) : Pour la recherche d'utilisateurs : retourne un tableau d'objets User */
	public static function getUsersFromSearch($clause,$data=array()){
		$db = Outils_Bd::getInstance()->getConnexion();
		
		$requete = "SELECT * FROM User WHERE {$clause}";
		
		if (isset($data['offset'])) {
			$requete .=	" LIMIT {$data['offset']}, {$data['itemsPerPage']}";
			unset($data['offset']);
			unset($data['itemsPerPage']);
		}
		
		$sth=$db->prepare($requete);
		$sth->execute();
		$liste = array();
		while (($ligne = $sth->fetch(PDO::FETCH_ASSOC)) !== false) {
		  	// ajouter un objet User dans le tableau
		  	$liste[] = new User($ligne);
		}
		return $liste;
	}
	
	// Methode count
    public static function count($clause="1=1", $data=array()) {
		
	  	$db = Outils_Bd::getInstance()->getConnexion();
	  	$sth=$db->prepare("SELECT count(*) as totalItems FROM User WHERE {$clause}");
	  	$sth->execute($data);
	  	$ligne = $sth->fetch(PDO::FETCH_ASSOC);
	 	return $ligne['totalItems'];
  }
  
  
  public static function topEvaluateur($limit){
	  	$db = Outils_Bd::getInstance()->getConnexion();
		
		$requete = "SELECT User.*,COUNT(*) as nbEval FROM User INNER JOIN Rating ON User.id_user=Rating.id_user WHERE score>-1 GROUP BY User.id_user ORDER BY nbEval DESC LIMIT {$limit}";		
		$sth=$db->prepare($requete);
		$sth->execute();
		$liste = array();
		while (($ligne = $sth->fetch(PDO::FETCH_ASSOC)) !== false) {
		  	// ajouter un objet User dans le tableau
		  	$liste[] = new User($ligne);
		}
		return $liste;
  }
	
	
	
	
	
	
	static public function infosAuteur($idUtilisateur){
	  /* creer la connection BD */
	  $db = Outils_Bd::getInstance()->getConnexion();
	  /* preparer le requête */
	  $sth = $db->prepare("SELECT * FROM utilisateur WHERE idUtilisateur=:idUtilisateur");
	  $data = array("idUtilisateur"=>$idUtilisateur);
	  /* exécuter la requête */
	  $sth->execute($data);
	  /* récupérer le résultat (unique ici) */
	  $ligne = $sth->fetch(PDO::FETCH_ASSOC);  
	  return $ligne;  
		
	}
  
	static public function lireMesPhotos($idUtilisateur) {
	  /* prendre la connection BD */
	  $db = Outils_Bd::getInstance()->getConnexion();
	  /* preparer le requete */
	  $sth=$db->prepare("SELECT * FROM photo WHERE confirmation=1 and idUtilisateur=:idUtilisateur ORDER BY dateIns DESC");
	  $data = array("idUtilisateur"=>$idUtilisateur);
  
	  /* executer la requete */
	  $sth->execute($data);
	  
	  $liste = array();
	  /* recuperer les resultats */
	  while (($ligne = $sth->fetch(PDO::FETCH_ASSOC)) !== false) {
		/* ajouter un objet Image dans le tableau */
		$liste[] = Photo::initializeFromData($ligne);
	  }
	  return $liste;
  
	}
  
  
	
  
	/* Méthode supprimer : faire la requête DELETE en BD */
	static public function modifDroits($idUtilisateur,$droitsMiseEnLigne) {
	  /* creer la connection BD */
	  $db = Outils_Bd::getInstance()->getConnexion();
	  /* preparer le requête de suppression d'un compte */
	  $sth=$db->prepare("update utilisateur set droitMiseEnLigne=:droitMiseEnLigne where idUtilisateur=:idUtilisateur");
	  /* recuperer les données */
	  $data=array('idUtilisateur' => $idUtilisateur,
		  'droitMiseEnLigne'=>$droitsMiseEnLigne
  );
  
	  /* executer la requête de suppression */
	  $sth->execute($data);
	}
  
	  public static function lireListeUsers(){
		  /* prendre la connection BD */
		  $db = Outils_Bd::getInstance()->getConnexion();
		  /* preparer le requete */
		  $sth=$db->query("SELECT * FROM utilisateur ORDER BY dateIns DESC");
		  return $sth->fetchAll(PDO::FETCH_ASSOC);
	  }
	  
	  public static function getDroitMiseEnLigne($idUtilisateur){
		  /* creer la connection BD */
		  $db = Outils_Bd::getInstance()->getConnexion();
		  /* preparer le requete */
		  $sth=$db->prepare("SELECT droitMiseEnLigne FROM utilisateur WHERE idUtilisateur=:idUtilisateur");
		  /* recuperer les donnes */
		  $data=array('idUtilisateur' => $idUtilisateur);
		  /* executer la requete */
		  $sth->execute($data);
		  /* recuperer le resultat */
		  $droits = $sth->fetch(PDO::FETCH_ASSOC);
		  return (!isset($droits['droitMiseEnLigne']))?0:$droits['droitMiseEnLigne'];
	  }
	  
	  
}
?>